# 作业：
# 一、定义一个学生Student类。有下面的实例属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
import random


class Student:
    def __init__(self,name:str,age:int,score:list):
        """
        # Student类。有下面的类属性：
        # 1 姓名 name
        # 2 年龄 age
        # 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
        :param name:
        :param age:
        :param score:
        """
        self.name = name
        self.age = age
        self.score = {"语文":score[0],"数学":score[1],"英语":score[2]}
        str_obj = {"姓名":self.name,"年龄":self.age,"成绩":self.score}
        with open('student.txt','r',encoding='utf-8') as f:
            all_data = f.read() # 拿到所有的结果
        if f"'姓名': '{self.name}'" not in all_data:
            with open("student.txt",'a',encoding='utf-8') as f:
                f.write(str(str_obj) + "\n")
    def get_name(self):
        # 1 获取学生的姓名：get_name() 返回类型:str
        return f"学生的姓名为：{self.name}"
    def get_age(self):
        # 2 获取学生的年龄：get_age() 返回类型:int
        return f"学生的年龄为：{self.age}"
    def get_course(self):
        # max(self.score,key=lambda name:self.score[name]) ，用匿名函数
        # 返回3门科目中最高的分数。get_course() 返回类型:int
        return f"学生姓名是：{self.name}，他的最高的科目成绩是：{max(self.score,key=lambda name:self.score[name])}"
    @classmethod
    def get_all_StudentInfo(self):
        # 获取所有学生的信息
        with open("student.txt",'r',encoding='utf-8') as f:
            for index,value in enumerate(f.readlines()):
                print(f"第{index+1}个学生的信息为：{value.strip()}")
"""if __name__ == '__main__': # 全篇执行入口
    zm = Student('zhangming', 20, [69, 88, 100])
    zs = Student('zhangsan', 20, [69, 88, 100])"""
    # print(zm.get_name())
    # print(zs.get_age())
    # print(zs.get_course())
    # Student.get_all_StudentInfo()
# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型;(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
class dictclass:
    def __init__(self,dict_obj:dict):
        self.dict_obj = dict_obj
    def del_key(self,key): # 删除某个key
        if key in self.dict_obj:
            # del self.dict_obj[key] # 第一种方式
            self.dict_obj.pop(key) # 第二种方式
            return f"删除成功！"
        else:
            return f"{key}不存在，删除失败！"
    def iskey(self,key):
        # 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
        if key in self.dict_obj:
            return self.dict_obj[key]
        else:
            return "not found"
    def get_DictKeyList(self):
        # 返回键组成的列表：返回类型;(list)
        return list(self.dict_obj.keys()) # .keys()：获取所有的键值
    def update_dict(self,dict2):
        # 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
        self.dict_obj.update(dict2)
        return list(self.dict_obj.values())
# if __name__ == '__main__':
    """d1 = dictclass({"name":"wave","age":19})
    # print(d1.del_key("888"))
    print(d1.del_key('name'))
    print(d1.dict_obj) #打印下这个字典
    print(d1.iskey('name')) # 判断name在不在
    print(d1.iskey('age')) # 判断age在不在
    print(d1.get_DictKeyList())
    print(d1.update_dict({"address": "kiti"}))
    print(d1.dict_obj)"""
    # dict2 = {"name":"suki","age":19,"address":"辽宁沈阳","phone_number":"1213543523"}
    # print(list(dict2.keys()))
# 三、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
class Listinfo:
    def __init__(self,obj:list):
        self.obj = obj
    def add_key(self,keyname):
        self.obj.append(keyname)
        return f"添加{keyname}成功！"
    def get_key(self,num):
        # num取出第几个
        """try:
            return self.obj[num-1] # 第几个的数字-1不就是对应索引位了
        except:
            return f"要查看的值不存在！"""
        if num-1 in [i for i in range(len(self.obj))]: # [1,2,3,4]  4
            return self.obj[num-1]
        else:
            return f"要查看的值不存在！"
    def update_list(self,list2):
        # self.obj = self.obj + list2
        self.obj.extend(list2)
        return self.obj
    def delete_LastValue(self):
        # 删除并且返回最后一个元素：del_key()
        r = self.obj.pop(len(self.obj)-1)
        return f"删除的元素是：{r}"
"""if __name__ == '__main__':
    l1 = Listinfo([1,2,3,4,5])
    print(l1.add_key(99))
    print(l1.obj) # 查看这个列表
    print(l1.get_key(4))
    print(l1.get_key(7))
    print(l1.update_list([99, 88, 22]))
    print(l1.delete_LastValue())"""
# 四、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
class Student_dian:
    dict_obj = {} # 类属性来进行存储
    def InserStudent(self,name,age,address,phone_number):
        if name not in self.dict_obj:
            self.dict_obj[name] = {"年龄":age,"地址":address,"手机号码":phone_number}
            print("存入成功！")
        else:
            print("存入失败！学生已经存在！")
    def updateStudent(self,name,new_name ,age,address,phone_number):
        if name in self.dict_obj:
            self.dict_obj.pop(name)
            self.dict_obj[new_name] = {"年龄":age,"地址":address,"手机号码":phone_number}
            print("更新成功！")
        else:
            print("更新失败，学生姓名不存在！")
    def deleteStudent(self,name):
        if name in self.dict_obj:
            self.dict_obj.pop(name)
            print("删除成功！")
        else:
            print("删除失败，学生姓名不存在！")
    def showAllStudent(self):
        for index,value in enumerate(self.dict_obj):
            # 循环的是key
            # {"张三丰":{"年龄":age,"地址":address,"手机号码":phone_number}}
            # self.dict_obj[key][key]
            print(f"第{index+1}个学生姓名为：{value}，学生年龄是：{self.dict_obj[value]['年龄']}，学生地址是：{self.dict_obj[value]['地址']}，学生手机号码是：{self.dict_obj[value]['手机号码']}")
    def random_student(self):
        name = random.choice(list(self.dict_obj.keys()))
        return f"{name}到！"
"""if __name__ == '__main__':
    s1 = Student_dian() # 实例化s1对象
    s1.InserStudent('张三', 19, "沈阳", "13567667892")
    s1.InserStudent('张二', 19, "沈阳", "13567667892")
    s1.InserStudent('张一', 19, "沈阳", "13567667892")
    s1.InserStudent('社会琳', 19, "沈阳", "13567667892")
    s1.InserStudent('好健康', 19, "沈阳", "13567667892")
    s1.updateStudent("张三","张山峰",19, "沈阳", "13567667892")
    s1.deleteStudent("张山峰")
    s1.showAllStudent()
    print(s1.random_student())"""


# 五、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
class DianSystem:
    dict1 = {} # 所有的菜品
    def add(self,name,price):
        if price > 15:
            print("价格太高，菜品新增失败")
        else:
            self.dict1[name] = {"价格":price,"库存":999,"分数":[]}
            print(f"新增菜品：{name}成功！")
    def Delisted_ishes(self,name):
        if name in self.dict1:
            self.dict1.pop(name)
            print("下架菜品成功！")
        else:
            print("菜品不存在，下架失败！")
    def Update_ishes(self,name,new_name,new_price):
        if name in self.dict1:
            inventory = self.dict1[name]['库存']
            cour_list = self.dict1[name]['分数']
            self.dict1.pop(name)
            self.dict1[new_name] = {"价格":new_price,"库存":inventory,"分数":cour_list}
            print(f"更新菜品名称和价格成功：{new_name}，价格为：{new_price}")
        else:
            print("菜品不存在，更新失败！")
    def Dish_out(self,name):
        self.dict1[name]['库存'] -=1
        cour = int(input("请输入你对本次菜品的评分（1~5）分："))
        if cour >=0 and cour <=5:
            self.dict1[name]['分数'].append(cour)
    def Report_on_dish_rating(self):
        # 获取所有的菜品分数
        dict2 = {} # 做展示使用
        result = [] # 收集剩余的菜品（大于3分的平均分）
        for key,value in self.dict1.items(): # 按照菜名和菜品详细进行遍历
            try: # 因为有些菜没有出，所以会有除0error
                dict2[key] = sum(self.dict1[key]['分数']) / len(self.dict1[key]['分数'])
            except:
                dict2[key] = 0 # 所以在这里，直接赋值0吧
        for key,value in dict2.items(): # 遍历一下，打印所有的菜品
            print(f"当前菜品为：{key}，菜品平均分数是：{value}")
            if value < 3:
                pass
            else: # 顺便收集一下超过3分的菜品
                result.append(key)
        if result: # 判断，这里是列表不为空的情况
            print(f"除去小于3分的菜品，剩余所有的菜品为：{result}") # 打印剩下的菜
        else: # 这里是列表为空
            print("所有的菜都没了，好好经营饭店吧！")
"""if __name__ == '__main__':
    d1 = DianSystem()
    d1.add("鱼香肉丝",13)
    d1.add("锅包肉",10)
    d1.Update_ishes("锅包肉","锅包肉段",14)
    d1.Dish_out("锅包肉段")
    d1.Dish_out("锅包肉段")
    d1.Dish_out("锅包肉段")
    print(d1.dict1)
    d1.Report_on_dish_rating()"""



# 六、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
class Desk:
    def __init__(self,length,width,height):
        self.length = length
        self.width = width
        self.height = height
    def showInfo(self):
        print(f"桌子长是：{self.length}，宽：{self.width}，高：{self.height}")
"""d = Desk(10,19,20)
d2 = Desk(11,21,5)
d.showInfo()
d2.showInfo()"""

# 七、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
class User:
    username = "admin"
    password = "123456"

# 八、定义一个计算器类，有加减乘除四个方法
class Calculator:
    def __init__(self,num1,num2):
        self.num1 = num1
        self.num2 = num2
    def jian(self):
        return self.num1-self.num2
    def add(self):
        return self.num1+self.num2
    def cheng(self):
        return self.num1 * self.num2
    def chu(self):
        return self.num1 / self.num2

# 九、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"{self.name}早上好！")

# 十、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
class BookSystem:
    def add(self,book_name,z_name,create_time):
        with open('book.txt','r',encoding='utf-8') as f:
            all_data = f.read()
        if f"图书名：{book_name}" not in all_data:
            with open("book.txt",'a',encoding='utf-8') as f:
                f.write(f"图书名：{book_name}，作者为：{z_name}，新建时间为：{create_time}\n")
        else:
            print("新增图书失败，图书已经存在！")
    def update(self,book_name,new_name,z_name,create_time):
        with open('book.txt','r',encoding='utf-8') as f:
            all_data = f.read()
        if f"图书名：{book_name}" not in all_data:
            print("图书不存在， 无法进行修改！")
        else:
            with open('book.txt','r',encoding='utf-8') as f:
                all_line = f.readlines()
            with open('book.txt','w',encoding='utf-8') as f:
                for line in all_line:
                    if f"图书名：{book_name}" in line:
                        all_line.remove(line)
                all_line.append(f"图书名：{new_name}，作者为：{z_name}，新建时间为：{create_time}\n")
                f.writelines(all_line)
                print("修改图书成功！")
    def delete(self,book_name):
        with open('book.txt','r',encoding='utf-8') as f:
            all_data = f.read()
        if f"图书名：{book_name}" not in all_data:
            print("图书不存在， 无法进行删除！")
        else:
            with open('book.txt','r',encoding='utf-8') as f:
                all_line = f.readlines()
            with open('book.txt','w',encoding='utf-8') as f:
                for line in all_line:
                    if f"图书名：{book_name}" in line:
                        all_line.remove(line)
                f.writelines(all_line)
                print("删除图书成功！")
    def search(self,type):
        """
        :param type: 参数为1，精确搜索，参数为2，全部返回
        :return:
        """
        if type == "1" or type == 1:
            b_name = input("请输入要查询的图书名称：")
            with open('book.txt', 'r', encoding='utf-8') as f:
                all_line = f.readlines() # 跟迭代器是一样的，有指针的概念，如果之前都拿走了，下次再拿就是空的了
            with open('book.txt', 'r', encoding='utf-8') as f:
                all_data = f.read() # 避免是空的，再创建一个篮子取鸡蛋
            if f"图书名：{b_name}" in all_data:
                for i in all_line:
                    if f"图书名：{b_name}" == i.split("，")[0]:
                        print(f"当前图书信息为：{i}")

            else:
                print("图书不存在，查找失败！")
        elif type =='2' or type == 2:
            with open('book.txt', 'r', encoding='utf-8') as f:
                print(f.read())
"""if __name__ == '__main__':
    b1 = BookSystem()
    # b1.add("三国新记","范仲淹","2024-2-12")
    # b1.add("水浒","范仲淹","2024-2-12")
    # b1.add("水浒1","范仲淹","2024-2-12")
    # b1.search(2)
    # b1.search(1)
    # b1.delete("水浒")
    # b1.delete("啦啦啦")
    b1.update("水浒1","水浒plus","张三","2025-2-13")
"""

# 十一、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
class Car:
    def start_engine(self):
        print("启动汽车引擎！")
    def stop_engine(self):
        print("关闭汽车引擎！")

# 十二、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
# 十三、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
class Person1:
    def __init__(self,weight):
        self.weight = weight
    def run(self):
        if self.weight < 20:
            print("你已经很瘦了，不要再减肥了！")
        else:
            self.weight -= 0.5
    def eat(self):
        self.weight +=1
# 十四、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
class Play:
    def __init__(self,spear,bullet):
        self.spear = spear
        self.bullet = bullet
    def fashe(self,bull):
        if self.bullet >= bull:
            self.bullet -= bull
        else:
            print("子弹不足，发射失败")
    def add_bull(self,bull):
        self.bullet += bull
        print("子弹系只能完毕")
if __name__ == '__main__':
    p1 = Play("ak47",100)
    p1.fashe(50)
    print(p1.bullet) # 打印还有多少子弹
    p1.fashe(50)
    print(p1.bullet)# 打印还有多少子弹
    p1.add_bull(10)
    print(p1.bullet) # 打印还有多少子弹
    p1.fashe(20)
    print(p1.bullet)  # 打印还有多少子弹






